package com.hrm.houfei.biz.impl;

import java.util.Date;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;

import com.hrm.houfei.biz.IMoneyPaymentBiz;
import com.hrm.houfei.biz.IPersonFileBiz;
import com.hrm.houfei.dao.IMoneyPaymentAddDAO;
import com.hrm.houfei.dao.IMoneyPaymentDetailsDAO;
import com.hrm.houfei.dao.IPersonFileDAO;
import com.hrm.houfei.po.Moneydetails;
import com.hrm.houfei.po.Moneypaymentadd;
import com.hrm.houfei.po.Moneypaymentdetails;
import com.hrm.houfei.po.Personfile;
import com.hrm.houfei.utils.CreatRandom;
import com.hrm.houfei.utils.MyDate;

/**
 * 薪酬发放管理业务实现类
 * 
 * @author Administrator
 * 
 */
public class MoneyPaymentBizImpl implements IMoneyPaymentBiz {
	// 薪酬发放登记dao接口
	IMoneyPaymentAddDAO impadao = null;
	// 薪酬发放详细信息dao接口
	IMoneyPaymentDetailsDAO impddao = null;
	// 人员档案信息业务接口
	IPersonFileDAO ipfdao = null;

	public void setImpddao(IMoneyPaymentDetailsDAO impddao) {
		this.impddao = impddao;
	}

	public void setImpadao(IMoneyPaymentAddDAO impadao) {
		this.impadao = impadao;
	}

	public void setIpfdao(IPersonFileDAO ipfdao) {
		this.ipfdao = ipfdao;
	}

	public MoneyPaymentBizImpl() {
		super();
	}

	/**
	 * 多条件分页模糊查询
	 * 
	 * @param name
	 *            姓名
	 * @param date
	 *            登记时间
	 * @param start
	 *            索引
	 * @param limit
	 *            每页要显示的记录
	 * @return 当前页的所有记录
	 */
	public List<Moneypaymentadd> findMoneypaymentByPage(String name,
			String date, String start, String limit) {
		// 离线查询
		DetachedCriteria criteria = DetachedCriteria
				.forClass(Moneypaymentadd.class);

		// 给参数设置默认值
		if (null == start || "".equals(start)) {
			start = "0";
		}
		if (null == limit || "".equals(limit)) {
			limit = "10";
		}

		// 如果查询条件(姓名)不为空,将条件附加上
		if (name != null && !name.equals("")) {
			criteria.add(Restrictions.like("pfName", name, MatchMode.ANYWHERE));
		}
		// 如果查询条件(登记时间)不为空,将条件附加上
		if (date != null && !"".equals(date)) {
			criteria.add(Restrictions.like("mpaAddDate", date,
					MatchMode.ANYWHERE));
		}

		// 调用dao执行查询
		List<Moneypaymentadd> list = this.impadao.findMoneypaymentByPage(
				criteria, Integer.parseInt(start), Integer.parseInt(limit));
		return list;
	}

	/**
	 * 条件查询记录的条数
	 * 
	 * @param name
	 *            姓名
	 * @param date
	 *            登记时间
	 * @return 总记录的条数(包含条件)
	 */
	public int getListCountByCondition(String name, String date) {
		// 离线查询
		DetachedCriteria criteria = DetachedCriteria
				.forClass(Moneypaymentadd.class);
		// 如果查询条件(姓名)不为空,将条件附加上
		if (null != name && !"".equals(name)) {
			criteria.add(Restrictions.like("pfName", name, MatchMode.ANYWHERE));
		}
		// 如果查询条件(登记时间)不为空,将条件附加上
		if (null != date && !"".equals(date)) {
			criteria.add(Restrictions.like("mpaAddDate", name,
					MatchMode.ANYWHERE));
		}
		// 调用dao执行查询
		int listCount = this.impadao.getMoneypaymentByPageListCount(criteria);
		return listCount;
	}

	/**
	 * 根据薪酬发放单号查询薪酬发放单详细信息
	 * 
	 * @param mpaUniqueId
	 *            薪酬发放单号(唯一)
	 * @return 薪酬发放单详细信息实体
	 */
	public Moneypaymentdetails findByUniqueProperty(String mpaUniqueId) {
		Moneypaymentdetails mpd = (Moneypaymentdetails) this.impddao
				.findByProperty("mpaUniqueId", mpaUniqueId).get(0);
		return mpd;
	}

	/**
	 * 审核薪酬发放单
	 * 
	 * @param mpd
	 *            薪酬发放单详细信息实体
	 * @param mpaUniqueId
	 *            薪酬发放单号
	 * @return 成功返回true 否则返回false
	 */
	public boolean checkMoneyPayment(Moneypaymentdetails mpd, String mpaUniqueId) {
		try {
			// 获取薪酬发放单详细信息实体
			Moneypaymentdetails savempd = (Moneypaymentdetails) this.impddao
					.findByProperty("mpaUniqueId", mpaUniqueId).get(0);
			// 奖励金额
			savempd.setMpdBounsMoney(mpd.getMpdBounsMoney());
			// 绩效金额
			savempd.setMpdTaskMoney(mpd.getMpdTaskMoney());
			// 扣除金额
			savempd.setMpdDeductMoney(mpd.getMpdDeductMoney());
			// 奖励描述
			savempd.setMpdBounsMemo(mpd.getMpdBounsMemo());
			// 扣除描述
			savempd.setMpdDeductContent(mpd.getMpdDeductContent());
			/** 更新薪酬发放单详细信息 */
			this.impddao.update(savempd);

			// 获取薪酬发放单实体
			Moneypaymentadd mpa = (Moneypaymentadd) this.impadao
					.findByProperty("mpaUniqueId", mpaUniqueId).get(0);
			// 应发金额=奖励+绩效+薪酬标准金额
			double countMoney = mpd.getMpdBounsMoney() + mpd.getMpdTaskMoney()
					+ savempd.getMpdMoneyStandardValue();
			// 实发工资=应发工资-扣除工资
			double factMoney = countMoney - mpd.getMpdDeductMoney();
			// 设置应发工资
			mpa.setMiCountMoney(countMoney);
			// 设置实发公司
			mpa.setMpaFactMoney(factMoney);
			// 设置状态
			mpa.setMpaState("通过审核");
			/** 更新薪酬发放单信息 */
			this.impadao.update(mpa);
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * 薪酬发放登记
	 * 
	 * @param mpa
	 *            薪酬发放单实体
	 * @param mpd
	 *            薪酬发放详细信息
	 * @return
	 */
	public boolean addMoneyPayment(Moneypaymentadd mpa, Moneypaymentdetails mpd) {
		try {

			// 随机产生一个薪酬发放单号
			String mpaUniqueId = CreatRandom.createRandomMoneyPaymentId();

			/**
			 * 
			 * 薪酬发放单
			 */
			// 设置薪酬发放单号
			mpa.setMpaUniqueId(mpaUniqueId);
			// 设置登记事件
			mpa.setMpaAddDate(MyDate.getNowDate("yyyy-MM-dd HH:mm:ss"));
			// 设置薪酬发放单状态
			mpa.setMpaState("未审核");
			// 获取人员档案信息实体
			List<Personfile> list = this.ipfdao.findByProperty("pfFileId", mpa
					.getPfFileId());
			Personfile pf = list.get(0);
			// 设置人员档案信息
			mpa.setPersonfile(pf);
			// 保存薪酬发放单
			this.impadao.save(mpa);

			/**
			 * 
			 * 薪酬发放详细信息
			 */

			// 设置薪酬发放单号
			mpd.setMpaUniqueId(mpaUniqueId);
			// 设置薪酬发放单pkid
			List<Moneypaymentadd> listmpa = this.impadao.findByProperty(
					"mpaId", mpa.getMpaId());
			Moneypaymentadd monpayadd = listmpa.get(0);
			mpd.setMoneypayment(monpayadd);
			// 保存薪酬发放详细信息
			this.impddao.save(mpd);

			/**
			 * 
			 * 计算实发工资,应发工资(更新薪酬发放单信息)
			 */
			// 应发工资=薪酬标准额+奖励金额+绩效金额
			double yingfagongzi = mpd.getMpdMoneyStandardValue()
					+ mpd.getMpdBounsMoney() + mpd.getMpdTaskMoney();
			// 实发工资=总金额-应扣工资
			double shifagongzi = yingfagongzi - mpd.getMpdDeductMoney();
			// 设置应发工资
			monpayadd.setMiCountMoney(yingfagongzi);
			// 设置实发工资
			monpayadd.setMpaFactMoney(shifagongzi);
			// 更新薪酬发放单信息
			this.impadao.update(monpayadd);

			return true;
		} catch (Exception e) {
			return false;
		}
	}

}
